<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>instanceof方法</title>
</head>
<body>
  <script>
    // instanceof 运算符用于检测构造函数的prototype属性是否出现在某个实例对象的原型链上
    // 使用如下 object instanceof constructor
    // object为实例对象，constructor为构造函数
    // 构造函数通过new 可以实例对象，instanceof能判断这个对象是否是之前那个构造函数生成的对象

    // 定义构建函数
    let Car = function() {}
    let benz = new Car()
    benz instanceof Car // true
    let car = new String('xxx')
    car instanceof String // true
    let str = 'xxx'
    str instanceof String // false

    // instanceof 的实现原理
    function myInstanceof(left, right) {/*  */
      // 这里先用typeof来判断基础数据类型，如果是，直接返回false
      if (typeof left !== 'object' || left === null) return false
      // getProtypeOf是object对象自带的API，能够拿到参数的原型对象
      let proto = Object.getPrototypeOf(left)
      while(true) {
        if (proto === null) return false
        if (proto === right.prototype) return true // 找到相同原型对象，返回true
        proto = Object.getPrototypeOf(proto)
      }
    }
    /// 也就是顺着原型链去找，直到找到相同的原型对象，返回true，否则返回false

    // 和typeof的区别
  /*
  1. typeof 会返回一个变量的基本类型，instanceof返回的是一个布尔值
  2. instanceof可以准确的判断复杂引用的数据类型，但是不能正确判断基础数据类型
  3. typeof 虽然可以判断基础数据类型（null)除外。但是在引用数据类型中，除了function类型。其他的无法判断
  */
  </script>
</body>
</html>